package com.warren.system.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

/**
 * @author warren
 */
public abstract class AspectSupport {

    Method resolveMethod(ProceedingJoinPoint point){
        MethodSignature signature = (MethodSignature) point.getSignature();
        Class<?> targetClass = point.getTarget().getClass();

        Method method = getDeclaredMethod(targetClass, signature.getName(),signature.getMethod().getParameterTypes());

        if (method == null){
            throw new IllegalStateException("无法解析目标方法:" + signature.getMethod().getName());
        }
        return method;
    }

    private Method getDeclaredMethod(Class<?> clazz,String name,Class<?>... parameterTypes){

        try {
            return clazz.getDeclaredMethod(name,parameterTypes);
        } catch (NoSuchMethodException e) {
            Class<?> superClass = clazz.getSuperclass();
            if (superClass != null){
                return getDeclaredMethod(superClass,name,parameterTypes);
            }
        }
        return null;
    }
}
